// 标准库头文件
#include <ctime>

// Qt核心头文件
#include <QMouseEvent>
#include <QKeyEvent>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QPainter>
#include <QFont>
#include <QDebug>
#include <QFile>

// 项目自定义头文件
#include "mainscene.h"
#include "config.h"
#include "map.h"
#include "heroplane.h"
#include "bomb.h"

#include <QMediaDevices>
#include <QAudioDevice>

//构造函数
MainScene::MainScene(QWidget *parent)
    : QWidget(parent)
    , m_isGameOver(false)
    , m_lifeCount(3)  // 初始3条命
    , m_recorder(0)
    , m_backgroundMusic(nullptr)
    , m_audioOutput(nullptr)
{
    // 初始化英雄动画
    m_hero.initAnimation();

    // 初始化场景
    initScene();

    // 启动游戏
    playGame();
}

MainScene::~MainScene()
{
    // 释放媒体播放器资源
    if(m_backgroundMusic)
    {
        m_backgroundMusic->stop();
        delete m_backgroundMusic;
    }
    if(m_audioOutput)
    {
        delete m_audioOutput;
    }

    for(int i = 0; i < ENEMY_NUM; i++) {
        if(m_enemys[i].m_movie) {
            m_enemys[i].m_movie->stop();
            delete m_enemys[i].m_movie;
        }
    }
}


//初始化函数
void MainScene::initScene()
{
    //窗口设置
    ///初始化窗口大小
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);
    ///设置窗口标题
    setWindowTitle(GAME_TITLE);
    ///设置图标资源
    setWindowIcon(QIcon( GAME_ICON));

    // 游戏状态初始化
    ///初始生命值
    m_lifeCount = 3;
    m_isGameOver = false;
    m_recorder = 0;

    //定时器设置
    m_Timer.setInterval(GAME_RATE);

    //随机数种子
    srand((unsigned int)time(NULL));

    // 初始化音频系统
    initAudio();

    // 加载血量图标
    m_heartPixmap.load(HP_PIC); // 确保路径正确
    if (m_heartPixmap.isNull()) {
        qDebug() << "Failed to load heart image!";
    }

    for(int i = 0; i < ENEMY_NUM; i++) {
        m_enemys[i].initAnimation(ENEMY_PATH); // 替换为你的GIF路径
    }

    // 初始化所有爆炸动画
    for(int i = 0; i < BOMB_NUM; i++) {
        m_bombs[i].initAnimation(BOMB_PATH); // 你的GIF路径
    }
}

void MainScene::initAudio()
{
    // 创建音频输出
    m_audioOutput = new QAudioOutput(this);
    m_audioOutput->setVolume(50);  // 设置音量 (0-100)

    // 创建背景音乐播放器
    m_backgroundMusic = new QMediaPlayer(this);
    m_backgroundMusic->setAudioOutput(m_audioOutput);
    m_backgroundMusic->setSource(QUrl::fromLocalFile(SOUND_BACKGROUND));
    m_backgroundMusic->setLoops(QMediaPlayer::Infinite);  // 循环播放
}

//游戏主循环
void MainScene::playGame()
{
    //启动定时器
    m_Timer.start();

    //启动背景音乐
    if(m_backgroundMusic)
    {
        m_backgroundMusic->play();
    }

    //监听定时器
    connect(&m_Timer, &QTimer::timeout, this, [this]() {
        if (!m_isGameOver) {
            gameFrameUpdate();
        }
    });
}

void MainScene::gameFrameUpdate()
{
    // 敌机出场
    enemyToScene();

    // 更新游戏元素坐标
    updatePosition();

    // 碰撞检测
    collisionDetection();

    // 请求重绘
    update();
}


//位置更新函数
void MainScene::updatePosition()
{
    // 更新地图坐标
    m_map.mapPosition();

    // 英雄飞机发射子弹
    m_hero.shoot();

    // 更新所有子弹位置
    updateBulletsPosition();

    // 更新所有敌机位置
    updateEnemiesPosition();

    // 更新爆炸效果
    updateBombsPosition();

    // 更新无敌状态计时器
    updateInvincibleStatus();
}

void MainScene::updateBulletsPosition()
{
    for (int i = 0; i < BULLET_NUM; i++) {
        if (!m_hero.m_bullets[i].m_Free) {
            m_hero.m_bullets[i].updatePosition();
        }
    }
}

void MainScene::updateEnemiesPosition()
{
    for (int i = 0; i < ENEMY_NUM; i++) {
        if (!m_enemys[i].m_Free) {
            m_enemys[i].updatePosition();
        }
    }
}

void MainScene::updateBombsPosition()
{
    for (int i = 0; i < BOMB_NUM; i++) {
        if (!m_bombs[i].m_Free) {
            m_bombs[i].updateInfo();
        }
    }
}

void MainScene::updateInvincibleStatus()
{
    if (m_hero.m_isInvincible) {
        m_hero.m_invincibleTimer--;
        if (m_hero.m_invincibleTimer <= 0) {
            m_hero.m_isInvincible = false;
        }
    }
}


//***************绘图事件
void MainScene::paintEvent(QPaintEvent* event)
{
    Q_UNUSED(event);  // 避免未使用参数警告

    QPainter painter(this);

    // 绘制背景地图
    drawBackground(painter);

    // 绘制游戏元素
    drawGameElements(painter);

    // 绘制UI元素
    drawUIElements(painter);

    // 游戏结束画面
    if (m_isGameOver) {
        drawGameOverScreen(painter);
    }
}

void MainScene::drawBackground(QPainter& painter)
{
    painter.drawPixmap(m_map.m_map1_posY, 0, m_map.m_map1);
    painter.drawPixmap(m_map.m_map2_posY, 0, m_map.m_map2);
}

void MainScene::drawGameElements(QPainter& painter)
{
    // 绘制英雄飞机（非无敌状态或闪烁可见时）
    if (!m_hero.m_isInvincible || (m_hero.m_invincibleTimer % 10 < 5)) {
        if(!m_hero.m_currentFrame.isNull()) {
            painter.drawPixmap(m_hero.m_X, m_hero.m_Y, m_hero.m_currentFrame);
        }
    }
    // 绘制子弹
    for (int i = 0; i < BULLET_NUM; i++) {
        if (!m_hero.m_bullets[i].m_Free) {
            painter.drawPixmap(m_hero.m_bullets[i].m_X,
                               m_hero.m_bullets[i].m_Y,
                               m_hero.m_bullets[i].m_Bullet);
        }
    }

    // 绘制敌机
    for (int i = 0; i < ENEMY_NUM; i++) {
        if (!m_enemys[i].m_Free) {
            // 使用当前动画帧而不是静态图片
            if(!m_enemys[i].m_currentFrame.isNull()) {
                painter.drawPixmap(m_enemys[i].m_X,
                                   m_enemys[i].m_Y,
                                   m_enemys[i].m_currentFrame);
            }
        }
    }

    // 绘制爆炸效果
    for (int i = 0; i < BOMB_NUM; i++) {
        if(!m_bombs[i].m_Free && !m_bombs[i].m_currentFrame.isNull()) {
            painter.drawPixmap(m_bombs[i].m_X,
                               m_bombs[i].m_Y,
                               m_bombs[i].m_currentFrame);
        }
    }
}

void MainScene::drawUIElements(QPainter& painter)
{
    // 绘制血量（右上角）
    for (int i = 0; i < m_lifeCount; ++i) {
        painter.drawPixmap(GAME_WIDTH - 40 - i * 30,  // X坐标（从右向左排列）
                           10,                         // Y坐标
                           30,                         // 宽度
                           30,                         // 高度
                           m_heartPixmap);
    }
}

void MainScene::drawGameOverScreen(QPainter& painter)
{
    // 绘制Game Over文字
    painter.setPen(Qt::red);
    painter.setFont(QFont("Arial", 48, QFont::Bold));
    painter.drawText(rect(), Qt::AlignCenter, "GAME OVER");

    // 绘制重新开始提示
    painter.setFont(QFont("Arial", 24));
    painter.drawText(rect().adjusted(0, 100, 0, 0),
                     Qt::AlignCenter,
                     "Press R to Restart");

    // 添加分数显示
    painter.setFont(QFont("Arial", 24));
    painter.drawText(rect().adjusted(0, 60, 0, 0),
                     Qt::AlignCenter,
                     QString("Score: %1").arg(m_score));
}


//鼠标移动事件
void MainScene::mouseMoveEvent(QMouseEvent *event)
{
    int x = event->x() - m_hero.m_Rect.width()*0.5; //鼠标位置 - 飞机矩形的一半
    int y = event->y() - m_hero.m_Rect.height()*0.5;

    //边界检测
    if(x <= 0 )
    {
        x = 0;
    }
    if(x >= GAME_WIDTH - m_hero.m_Rect.width())
    {
        x = GAME_WIDTH - m_hero.m_Rect.width();
    }
    if(y <= 0)
    {
        y = 0;
    }
    if(y >= GAME_HEIGHT - m_hero.m_Rect.height())
    {
        y = GAME_HEIGHT - m_hero.m_Rect.height();
    }
    m_hero.setPosition(x,y);
}

void MainScene::enemyToScene()
{
    m_recorder++;
    if(m_recorder < ENEMY_INTERVAL)
    {
        return;
    }

    m_recorder = 0;

    for(int i = 0 ; i< ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free)
        {
            //敌机空闲状态改为false
            m_enemys[i].m_Free = false;
            //设置坐标
            m_enemys[i].m_Y = rand() % (GAME_HEIGHT - m_enemys[i].m_Rect.height());
            m_enemys[i].m_X = GAME_WIDTH + m_enemys[i].m_Rect.height();
            break;
        }
    }
}

void MainScene::collisionDetection()
{
    //遍历所有非空闲的敌机
    for(int i = 0 ;i < ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free)
        {
            //空闲飞机 跳转下一次循环
            continue;
        }

        //遍历所有 非空闲的子弹
        for(int j = 0 ; j < BULLET_NUM;j++)
        {
            if(m_hero.m_bullets[j].m_Free)
            {
                //空闲子弹 跳转下一次循环
                continue;
            }

            //如果子弹矩形框和敌机矩形框相交，发生碰撞，同时变为空闲状态即可
            if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect))
            {
                m_score += 100; // 击毁敌机得分

                m_enemys[i].m_Free = true;
                m_hero.m_bullets[j].m_Free = true;
                //播放爆炸效果
                for(int k = 0 ; k < BOMB_NUM;k++)
                {
                    if(m_bombs[k].m_Free) {
                        m_bombs[k].m_Free = false;
                        m_bombs[k].m_X = m_enemys[i].m_X;
                        m_bombs[k].m_Y = m_enemys[i].m_Y;
                        m_bombs[k].m_movie->start(); // 开始播放动画
                        break;
                }
                //播放音效
                QMediaPlayer *explosionSound = new QMediaPlayer(this);
                QAudioOutput *audioOutput = new QAudioOutput(this);
                audioOutput->setVolume(50);
                explosionSound->setAudioOutput(audioOutput);
                explosionSound->setSource(QUrl::fromLocalFile(SOUND_BOMB)); // 爆炸音效
                explosionSound->play();

                // 连接信号，当播放完成时自动删除对象
                connect(explosionSound, &QMediaPlayer::playbackStateChanged,
                        [=](QMediaPlayer::PlaybackState state){
                            if(state == QMediaPlayer::StoppedState)
                            {
                                explosionSound->deleteLater();
                                audioOutput->deleteLater();
                            }
                        });

            }
            // 检测玩家与敌机碰撞
            // mainscene.cpp - collisionDetection()
            if (m_enemys[i].m_Rect.intersects(m_hero.m_Rect))
            {
                m_enemys[i].m_Free = true; // 删除撞到的敌机

                if (!m_hero.m_isInvincible) // 非无敌状态才扣血
                {
                    m_lifeCount--;
                    m_hero.m_isInvincible = true; // 进入无敌
                    m_hero.m_invincibleTimer = 60; // 无敌时间（60帧≈1秒）

                    if (m_lifeCount <= 0) gameOver();
                }
            }
            }
        }
    }
}

void MainScene::gameOver()
{
    m_isGameOver = true;
    m_Timer.stop();  // 停止游戏循环

    // 播放游戏结束音效
    QMediaPlayer *gameOverSound = new QMediaPlayer(this);
    QAudioOutput *audioOutput = new QAudioOutput(this);
    gameOverSound->setAudioOutput(audioOutput);
    gameOverSound->setSource(QUrl("qrc:/res/gameover.wav"));
    gameOverSound->play();

    // 触发信号（可用于界面更新）
    emit gameOverSignal();
    update(); // 强制重绘，显示Game Over画面
}

void MainScene::keyPressEvent(QKeyEvent *event)
{
    // 如果游戏结束，按 R 键重新开始
    if (event->key() == Qt::Key_R && m_isGameOver)
    {
        restartGame();
    }
    else
    {
        // 其他按键处理（可选）
        QWidget::keyPressEvent(event);  // 调用父类的默认处理
    }
}

void MainScene::restartGame()
{
    // 重置游戏状态
    m_isGameOver = false;
    m_lifeCount = 3;

    // 重置玩家位置
    m_hero.m_X = 0;                   //GAME_WIDTH / 2;
    m_hero.m_Y =(GAME_HEIGHT-100)/2;                     //GAME_HEIGHT - 100;

    // 清空所有敌机和子弹
    for (int i = 0; i < ENEMY_NUM; i++)
        m_enemys[i].m_Free = true;

    for (int i = 0; i < BULLET_NUM; i++)
        m_hero.m_bullets[i].m_Free = true;

    // 重新启动定时器
    m_Timer.start();
    update();
}